package com.micro.balance;

import java.util.Map;

import org.springframework.util.CollectionUtils;

/**
 * 负载算法抽象类
 * 目的：把通过功能给封装起来
 */
public abstract class AbstractLoadBalance implements ILoadBalance {

    /**
     * 选择一个服务实例
     * 如果没有可用的实例，返回null
     * 如果只有一个实例，直接返回该实例
     * 否则，调用doSelect方法进行具体的负载均衡选择
     *
     * @param map 服务实例的映射，键是实例名称，值是实例的权重
     * @return 选定的实例名称，如果没有选定则返回null
     */
	@Override
	public String select(Map<String,Integer> map) {
		// 检查map是否为空或仅有一个元素
		if(CollectionUtils.isEmpty(map)){
            return null;
        }
        if(map.size()==1){
            return map.keySet().iterator().next();
        }
        // 调用抽象方法doSelect进行负载均衡选择
        return doSelect(map);
	}

    /**
     * 执行负载均衡选择的具体逻辑
     * 由子类实现具体的负载均衡算法
     *
     * @param map 服务实例的映射，键是实例名称，值是实例的权重
     * @return 选定的实例名称
     */
	protected abstract String doSelect(Map<String,Integer> map);

}
